package org.eraser.mvc.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;

@Slf4j
@RestController
public class TestController {


    @GetMapping("/hello")
    public String getHello(HttpServletRequest request, HttpServletResponse response) throws IOException {
        return "Hello";
    }


    /**
     * 文件下载 下载资源是jar包中的文件
     *
     * @param request  请求
     * @param response 相应
     * @throws IOException 异常
     */
    @GetMapping("/get/file")
    public void getFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 读jar包中的文件 注意只能读取文件 不能读取目录
        ClassPathResource classPathResource = new ClassPathResource("temp/test.txt");

        // 类路径中 获取绝对路径 是会报错的 (读类路径下的文件没问题 但是不能获取绝对路径) classPathResource.getFile().getAbsolutePath()
        // log.info("类路径下文件的绝对路径: {}", classPathResource.getFile().getAbsolutePath());

        // 读取类路径下的文件 直接获取file也会报错 File file = classPathResource.getFile();
        // log.info("类路径下文件的绝对路径: {}", file.getAbsolutePath());
        byte[] contentAsByteArray = classPathResource.getContentAsByteArray();

        response.reset();
        response.setContentType("application/octet-stream");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + classPathResource.getFilename());

        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());
        bufferedOutputStream.write(contentAsByteArray);
        bufferedOutputStream.flush();
        bufferedOutputStream.close();
    }

    /**
     * 文件上传 上传后文件是存在 与jar包同一级的目录下
     * <>p</>
     * 注意 ClassPathResource 只能用于读取jar包中的文件 且只能用于获取文件的二进制流 如: byte[] InputStream 等
     * jar包中的文件不能使用如: classPathResource.getFile(); classPathResource.getFile().getAbsolutePath(); 等操作
     * <>p</>
     * 这个文件上传例子 File tempDirectory = new File(temp); 创建的不是jar包中的目录而是与jar包同一级的目录
     *
     * @param file 前端传入的文件
     * @throws IOException 异常
     */
    @PostMapping("/put/file")
    public void putFile(MultipartFile file) throws IOException {
        String temp = "temp/";
        // 临时文件夹 (与jar包同一级的目录)
        File tempDirectory = new File(temp);
        // 不存在则创建
        if (!tempDirectory.exists()) {
            boolean mkdir = tempDirectory.mkdir();
        }

        // 文件
        File tempFile = new File(temp + file.getOriginalFilename());
        // 文件不存在则创建
        if (!tempFile.exists()) {
            boolean mkdir = tempFile.createNewFile();
        }

        // 将前端传入的文件存入"本地"(与jar包同一级的目录)
        file.transferTo(new File(tempFile.getAbsolutePath()));

        log.info("临时文件夹绝对路径: {}", tempDirectory.getAbsolutePath());
        log.info("存入文件的绝对路径: {}", tempFile.getAbsolutePath());

    }

}
